<?php
include_once('../common/noticia.php');

include_once('../services/scrapping_noticias_service.php');
include_once('../services/palabras_clave_service.php');
include_once('../services/detectar_idioma_service.php');

//Constante que nos indica donde se encuentra el fichero de idiomas
define("directorio_fichero","../resources/idiomas.txt");

//Constante para definir el id de Yahoo que utilizaremos.
define("id_yahoo","fTSJ9mzV34EZ1AcVAG8ocLNLfsg_Yvm7Y_Kd6BcE8Xlf_pBp0rNly5JcSb67TXfjEgYBspffzA--");

/**
 * Clase encargada de lanzar la ejecución de la aplicación. Recorre todos los idiomas a estudiar e 
 * invoca las acciones pertinentes para cada uno de ellos.
 *
 */
class gestor_noticias
{	
	/**
	 * Llama al método obtener_numero_paginas de la clase scrapping_noticias.
	 *
	 * @param unknown_type $idioma
	 * @return unknown
	 */
	public function obtener_numero_paginas($idioma)
	{
		$url = "http://osha.europa.eu/".$idioma."/oshnews-view";		
		$scrapping = new scrapping_noticias_service();		
		return $scrapping->obtener_numero_paginas($url);
	}
	
	/**
	 * Separa cada una de las páginas que contienen las noticias.
	 *
	 * @param unknown_type $idioma
	 * @param unknown_type $num_pagina
	 * @return unknown
	 */
	public function recorrer_paginas($idioma,$num_pagina)
	{
		//Obtener el parámetro a partir del num de página
		$pagina = ($num_pagina)*20;
		echo "Estamos en la página $num_pagina.<br/><br/>";
		//Se le pasa cada página directamente por URL
		$url="http://osha.europa.eu/".$idioma."/oshnews-view?b_start:int=".$pagina."&-C=";				
		return $url;
	}
	
	/**
	 * Utiliza el parser de html para guardar el texto de cada noticia en un array.
	 *
	 * @param unknown_type $url
	 * @return unknown
	 */
	public function extraer_noticias($url){		
		//En este array vamos a guardar todos los enlaces que haya en la url pasada.
		$enlace_noticias[] = array();
		//En este array vamos a guardar todas las noticias
		$array_noticias[] = array();
		//Creamos una instancia de la clase scrapping_noticias
		$scrapping = new scrapping_noticias_service();
		//Guardamos todos los enlaces de noticias
		$enlace_noticias = $scrapping->obtener_enlace_noticias($url);
		//Recorrer el array con las url de las noticias concretas y
		//para cada una sacamos el título y contenido.
		$i=0;
		foreach ($enlace_noticias as $enlace) {
			$array_noticias[$i]= $scrapping->obtener_datos_noticia($enlace);
			//echo "*TITULO: ","***", $array_noticias[$i]->get_titulo(),"***", "<br/>";
			//echo "*CONTENIDO: ", "***", $array_noticias[$i]->get_contenido(),"***", "<br/><br/>";
			$i++;
		}		
		return $array_noticias;		
	}
	
	/**
	 * Crea el directorio donde se almacenan las noticias
	 * en caso de que éste no exista aún.
	 *
	 */
	protected function crear_directorio_noticias()
	{
		//Si aún no se ha creado el directorio de las noticias, lo creo.
		if(!is_dir("../noticias")) {
			mkdir("../noticias");
		}
	}
	
	/**
	 * Crea al fichero donde se almacenarán las noticias en un cierto
	 * idioma en caso de que dicho fichero no exista aún.
	 *
	 * @param unknown_type $idioma
	 */
	protected function crear_fichero_idioma($idioma)
	{
		//Crear el fichero para ese idioma si no existe
		if (!file_exists("../noticias/noticias-$idioma.xml")) {
			$documento = new domdocument("1.0","UTF-8");
			$raiz = new domelement("noticias");
			$raiz = $documento->appendChild($raiz);
			$documento->save("../noticias/noticias-$idioma.xml");
		}		
	}
	
	/**
	 * Comprueba si existe una cierta noticia dado su título.
	 *
	 * @param unknown_type $titulo
	 * @param unknown_type $nombre_fichero
	 * @return unknown
	 */
	protected function existe_noticia($titulo, $nombre_fichero)
	{
		$existe = false;
		$noticias = simplexml_load_file($nombre_fichero);
		$titulo = utf8_decode(utf8_encode($titulo));
		
		foreach($noticias as $noticia)
		{
			$primer_titulo = $noticia->titulo;
			//Mira a ver si la noticia se corresponde con la más nueva de las almacenadas
			if($titulo == $primer_titulo) {
				$existe = true;				
			}
		}
		return $existe;
	}
	
	/**
	 * Crea el documento Dom y almacena las noticias en él.
	 *
	 * @param unknown_type $idioma
	 * @param unknown_type $noticia
	 */
	protected function almacenar_en_dom($idioma, $noticia)
	{
		//Primero creamos el documento DOM
		$documento = new domdocument("1.0","UTF-8");
		$documento->load("../noticias/noticias-$idioma.xml");
		$raiz = $documento->documentElement;
		
		//Crear un nuevo nodo noticia y añadirlo.
		$nodo_noticia = new domelement("noticia");
		$nodo_noticia = $raiz->appendChild($nodo_noticia);
		
		//Darle a la noticia los valores correspondientes de título y contenido.
		$nodo_titulo = new domelement("titulo",html_entity_decode($noticia->get_titulo(),ENT_QUOTES,"UTF-8"));
		$nodo_titulo = $nodo_noticia->appendChild($nodo_titulo);		
		$nodo_contenido = new domelement("contenido",htmlspecialchars(html_entity_decode($noticia->get_contenido(),ENT_QUOTES,"UTF-8"),ENT_QUOTES,"UTF-8"));
		$nodo_contenido = $nodo_noticia->appendChild($nodo_contenido);
		
		//Si la noticia está escrita en inglés hay que extraer las palabras clave.
		//Para ello envío una consulta mediante cURL. Si la noticia es demasiado corta
		//no tiene sentido buscar palabras clave.
		if ($idioma == "en" && (strlen($noticia->get_contenido())>10)) {
			echo "Esta en ingles luego extraemos las palabras clave.<br/>";
			$palabras_clave = new palabras_clave_service();
			$palabras = $palabras_clave->extraer_palabras_clave($noticia->get_contenido(),id_yahoo,"php");
			
			//En $palabras tengo todas los términos que debo insertar en el php
			foreach($palabras as $palabra) {
				$nodo_palabra = new domelement("resultado",htmlspecialchars(html_entity_decode($palabra,ENT_QUOTES,"UTF-8"),ENT_QUOTES,"UTF-8"));
				$nodo_palabra = $nodo_noticia->appendChild($nodo_palabra);
			}
		}
		$documento->save("../noticias/noticias-$idioma.xml");		
	}
	
	/**
	 * Guardamos las noticias que previamente hemos obtenido en un fichero xml.
	 *
	 * @param unknown_type $idioma
	 * @param unknown_type $num_pagina
	 * @param unknown_type $array_noticias
	 * @return unknown
	 */
	public function guardar_noticias($idioma,$num_pagina,$array_noticias)
	{	
		$post_data['language'] = $idioma;
		
		$palabras_clave = array();
		$palabras = array();
		
		$this->crear_directorio_noticias();
		$this->crear_fichero_idioma($idioma);
		
		$num_noticia=0;
		$noticia = new noticia();
		
		//Para cada noticia
		for ($i=0;$array_noticias[$i]!=null;$i++) {
			echo "Vamos a guardar la noticia $num_pagina-$num_noticia.<br/>";
			$noticia = new noticia();
			$noticia = $array_noticias[$i];
			//echo $noticia->get_titulo(), "<br/>";
			
			//Comprobar si la noticia está en el idioma que dice estar.
			//echo "La noticia esta en *$idioma*<br/>";
			$detectar_idioma = new detectar_idioma_service();			
			if ($detectar_idioma->comprobar_idioma($noticia->get_contenido(),$idioma)) {
				echo "El idioma coincide.<br/><br/>";
				//Ya no hace falta Crear el archivo xml con DOM
				//Comprobar si existe la noticia antes de insertarla
				if($this->existe_noticia($noticia->get_titulo(),"../noticias/noticias-$idioma.xml")) {
					echo "Ojo: la noticia $num_pagina-$num_noticia ya existe.<br/><br/>";					
				}
				else
				{
					$this->almacenar_en_dom($idioma,$noticia);
				}
			}
			else {
				echo "ATENCION! El idioma no coincide: no se inserta.<br/><br/>";
			}
			$num_noticia++;
		}		
	}
	
}
?>